﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using FlexiCommerce.Collections;
//using FlexiCommerce.Components;

//namespace FlexiCommerce.Tests.Collections
//{
//    /// <summary>
//    /// Navigates a graph of content item nodes.
//    /// </summary>
//    public class ItemHierarchyNavigator<T> : IHierarchyNavigator<T>
//        where T : AbstractHeirachalDBItem<T>
//    {
//        private readonly HierarchyNode<T> currentNode = null;

//        public ItemHierarchyNavigator(HierarchyNode<T> currentNode)
//        {
//            this.currentNode = currentNode;
//        }

//        public ItemHierarchyNavigator(HierarchyBuilder<T> builder, params ItemFilter<T>[] filters)
//        {
//            currentNode = builder.Build(filters);
//        }

//        public ItemHierarchyNavigator(HierarchyBuilder<T> builder)
//        {
//            currentNode = builder.Build();
//        }

//        public HierarchyNode<T> CurrentNode
//        {
//            get { return currentNode; }
//        }

//        public ItemHierarchyNavigator<T> GetRootHierarchy()
//        {
//            return new ItemHierarchyNavigator<T>(GetRootNode());
//        }

//        public HierarchyNode<T> GetRootNode()
//        {
//            HierarchyNode<T> last = currentNode;
//            while (last.Parent != null)
//                last = last.Parent;
//            return last;
//        }

//        public IEnumerable<T> EnumerateAllItems()
//        {
//            HierarchyNode<T> rootNode = GetRootNode();
//            return EnumerateItemsRecursive(rootNode);
//        }

//        public IEnumerable<T> EnumerateChildItems()
//        {
//            return EnumerateItemsRecursive(currentNode);
//        }

//        protected virtual IEnumerable<T> EnumerateItemsRecursive(HierarchyNode<T> node)
//        {
//            yield return node.Current;
//            foreach (HierarchyNode<T> childNode in node.Children)
//            {
//                foreach (T childItem in EnumerateItemsRecursive(childNode))
//                {
//                    yield return childItem;
//                }
//            }
//        }

//        #region IHierarchyItem<GenericPersistenceItem> Members

//        public IHierarchyNavigator<T> Parent
//        {
//            get
//            {
//                if (currentNode.Parent != null)
//                    return new ItemHierarchyNavigator<T>(currentNode.Parent);
//                else
//                    return null;
//            }
//        }

//        public IEnumerable<IHierarchyNavigator<T>> Children
//        {
//            get
//            {
//                foreach (HierarchyNode<T> childNode in currentNode.Children)
//                {
//                    yield return new ItemHierarchyNavigator<T>(childNode);
//                }
//            }
//        }

//        public T Current
//        {
//            get { return currentNode.Current; }
//        }

//        public bool HasChildren
//        {
//            get { return currentNode.Children.Count > 0; }
//        }

//        #endregion
//    }
//}
